The Victory lets us add charts and data visualization into our React app.
In this article, we’ll look at how to add charts into our React app with Victory.
Plot Functions
We can plot functions in our React app with Victory easily.
For example, we can write:
import React from "react";
import { VictoryChart, VictoryLine } from "victory";
export default function App() {
return (
<VictoryChart>
<VictoryLine
samples={50}
style={{ data: { stroke: "red", strokeWidth: 4 } }}
y={(data) => Math.sin(2 * Math.PI * data.x)}
/>
</VictoryChart>
);
}
We set the samples
prop to set the number of points to plot.
Then y
is set to a function with the values we want to plot.
We get the x-axis value with data.x
and do what we want with it.
Component Events
We can add event handlers for components in our charts.
For example, we can write:
import React from "react";
import { VictoryBar } from "victory";
export default function App() {
return (
<VictoryBar
data={[
{ x: 1, y: 2, label: "A" },
{ x: 2, y: 4, label: "B" },
{ x: 3, y: 7, label: "C" },
{ x: 4, y: 3, label: "D" },
{ x: 5, y: 5, label: "E" }
]}
events={[
{
target: "data",
eventHandlers: {
onClick: () => {
return [
{
target: "labels",
mutation: (props) => {
return props.text === "clicked"
? null
: { text: "clicked" };
}
}
];
}
}
}
]}
/>
);
}
to add the events
prop into our VictoryBar
component.
In it, we add the eventHandlers.onClick
function to add click handlers to each bar.
Then in the mutation
method, we toggle the ‘clicked’ text as we click the bars.
Nested Component Events
We can trigger change in one part of the chart from other parts of the chart.
For instance, we can write:
import React from "react";
import { VictoryArea, VictoryBar, VictoryChart, VictoryStack } from "victory";
export default function App() {
return (
<VictoryChart
events={[
{
childName: ["area-1", "area-2"],
target: "data",
eventHandlers: {
onClick: () => {
return [
{
childName: "area-4",
mutation: (props) => {
const fill = props.style.fill;
return fill === "green"
? null
: { style: { fill: "green" } };
}
}
];
}
}
}
]}
>
<VictoryStack>
<VictoryArea
name="area-1"
data={[
{ x: "a", y: 2 },
{ x: "b", y: 3 },
{ x: "c", y: 5 },
{ x: "d", y: 4 }
]}
/>
<VictoryArea
name="area-2"
data={[
{ x: "a", y: 1 },
{ x: "b", y: 4 },
{ x: "c", y: 5 },
{ x: "d", y: 7 }
]}
/>
<VictoryArea
name="area-3"
data={[
{ x: "a", y: 3 },
{ x: "b", y: 2 },
{ x: "c", y: 6 },
{ x: "d", y: 2 }
]}
/>
<VictoryArea
name="area-4"
data={[
{ x: "a", y: 2 },
{ x: "b", y: 3 },
{ x: "c", y: 3 },
{ x: "d", y: 4 }
]}
/>
</VictoryStack>
</VictoryChart>
);
}
We have 4 VictoryArea
components to display filled areas formed from the points.
Then we add the events
prop to VictoryChart
.
childName
has the name
values of the components that triggers the mutation
function.
Then in the onClick
method we return an array with objects that specifies which component changes and how they change.
childName
has the name
of the component that changes.
mutation
has the code to change the component specified in childName
in the array returned by onClick
.
We toggle the fill
between 'green'
and null
on the VictoryArea
with name
area-4
.
Conclusion
We can plot functions and listen for events in chart components in React Victory’s charts.